package com.eclipse.e20200201_多线程同步.同步锁_类锁_静态方法;

public class SyncTest implements Runnable {
    //共享资源变量
    static int count = 0;

    @Override
    public  void run() {
    	//类锁就是 当前类的Class对象 就是类锁
        increaseCount();
    }

    private synchronized static void increaseCount() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + count++);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SyncTest syncTest1 = new SyncTest();
        SyncTest syncTest2 = new SyncTest();
        Thread thread1 = new Thread(syncTest1, "thread1");
        Thread thread2 = new Thread(syncTest2, "thread2");
        new Thread(syncTest2, "thread3").start();;
        thread1.start();
        thread2.start();
        
    }
    /**
    synchronized修饰静态方法

  我们知道静态方法是不属于当前实例的，而是属性类的，那么这个锁就是类的class对象锁，上述问题引刃而解，请看代码：
【demo3】
瞧瞧输出结果，问题解决了没？同样是new了两个不同实例，却保持了线程同步。那是我们synchronizd修饰的是静态方法，
run方法中调用这个静态方法，再说一次 静态方法不属于当前实例，而是属于类。所以这个方案其实是用的一个把锁，而这个锁就是这个类的class对象锁。
  需要注意的是如果一个线程A调用一个实例对象的非static synchronized方法，而线程B需要调用这个实例对象所属类的静态 synchronized方法，
是允许的，不会发生互斥现象，因为访问静态 synchronized 方法占用的锁是当前类的class对象，而访问非静态 synchronized 方法占用的锁是当前实例对象锁(结合demo2，demo3)。

作者：c_ychao
链接：https://www.jianshu.com/p/27f5935cafd8
来源：简书
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    
}
